public class test1 {
    //力扣 283.移动零  双指针解法
    public static void main(String[] args) {
        int[] arr = {1, 0, 2, 0, 0, 3, 4, 0};
//        //1.声明两个指针
//        int cur = 0;    //将数组划分成已处理和未处理两个区域
//        int dest = -1;  //将已处理区域划分成非零和零区域，非零在dest前面，零在dest后面
//        while (cur < arr.length) {
//            //2.1 cur遇到零，cur++
//            if (arr[cur] == 0) {
//                cur++;
//
//            } else {
//                //2.2 cur遇到非零，交换dest+1和cur的位置，相当于把非零元素划入到非零区域
//                swap(arr, dest + 1, cur);
//                dest++;
//                cur++;
//            }
//              print(arr);
//        }


        //代码简化后的版本

        for (int cur = 0, dest = -1; cur < arr.length; cur++) {
            if (arr[cur] != 0) {
                swap(arr, dest + 1, cur);
                dest++;
            }
        }
        print(arr);
    }


    private static void print(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }


    private static void swap(int[] arr, int dest, int cur) {
        int tmp = arr[dest];
        arr[dest] = arr[cur];
        arr[cur] = tmp;
    }
}
